﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using EFCore.AspNet.Sample.Models;

namespace EFCore.AspNet.Sample.Data
{
    /// <summary>
    /// 数据库上下文类
    /// 实体集通常对应数据库表。实体对应表中的行。
    /// 由于实体集包含多个实体，因此 DBSet 属性应为复数名称
    /// 编写使用 EF Core 的异步代码时需要注意的一些事项：
    /// 只有导致查询或发送数据库命令的语句才能以异步方式执行。 这包括 ToListAsync、SingleOrDefaultAsync、FirstOrDefaultAsync 
    /// 和 SaveChangesAsync。 不包括只会更改 IQueryable 的语句，例如 var students = context.Students.Where(s => s.LastName == "Davolio")。
    /// EF Core 上下文并非线程安全：请勿尝试并行执行多个操作。
    /// 要利用异步代码的性能优势，请验证在调用向数据库发送查询的 EF Core 方法时，库程序包（如用于分页）是否使用异步。
    /// </summary>
    public class SchoolContext : DbContext
    {
        public SchoolContext (DbContextOptions<SchoolContext> options)
            : base(options)
        {
        }

        public DbSet<Student> Students { get; set; }
        public DbSet<Enrollment> Enrollments { get; set; }
        public DbSet<Course> Courses { get; set; }
        public DbSet<Department> Departments { get; set; }
        public DbSet<Instructor> Instructors { get; set; }
        public DbSet<OfficeAssignment> OfficeAssignments { get; set; }
        public DbSet<CourseAssignment> CourseAssignments { get; set; }

        //Fluent API 替代特性
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Course>().ToTable("Course");
            modelBuilder.Entity<Enrollment>().ToTable("Enrollment");
            modelBuilder.Entity<Student>().ToTable("Student");
            modelBuilder.Entity<Department>().ToTable("Department");
            modelBuilder.Entity<Instructor>().ToTable("Instructor");
            modelBuilder.Entity<OfficeAssignment>().ToTable("OfficeAssignment");
            modelBuilder.Entity<CourseAssignment>().ToTable("CourseAssignment");

            modelBuilder.Entity<CourseAssignment>()
                .HasKey(c => new { c.CourseID, c.InstructorID });
        }
    }
}
